﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DAL.Model;
using DAL.Persistence;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Persistence
{
    /// <summary>
    /// Classe responsável pelas transações de Marcas no banco de dados
    /// </summary>
    public class MarcaDAL : DAL
    {
        /// <summary>
        /// Método para cadastrar uma marca no banco
        /// </summary>
        /// <param name="m">A marca a ser cadastrada</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Salvar(Marca m)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("CadastrarMarca", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@Nome", m.Nome);

                if (comando.ExecuteNonQuery() > 0)
                    return "Marca cadastrada com sucesso";
                else
                    throw new Exception("Erro ao cadastrar marca");
            }
            catch (SqlException ex)
            {
                return ex.Message;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Lista todos as marcas do banco de dados
        /// </summary>
        /// <returns>Retorna uma lista de objetos marca</returns>
        public List<Marca> Listar()
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarMarca", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Dispara a Consulta e armazena no DataReader

                List<Marca> listaDeMarcas = new List<Marca>();

                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    Marca c = new Marca();

                    //Ler os campos do banco para dentro do objeto Marca
                    c.IdMarca = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);

                    listaDeMarcas.Add(c);
                }

                return listaDeMarcas;
            }
            catch
            {
                return null;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Retorna uma marca do banco de dados baseado na ID
        /// </summary>
        /// <param name="IdMarca">O ID da marca</param>
        /// <returns>A marca</returns>
        public Marca ConsultaMarcaPorID(int IdMarca)
        {
            try
            {
                comando = new SqlCommand("ConsultarMarcaPorID", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader               

                Marca c = null;
                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    c = new Marca();

                    //Ler os campos do banco para dentro do objeto Categoria
                    c.IdMarca = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);
                }

                return c;

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Atualiza uma marca do banco de dados
        /// </summary>
        /// <param name="m">A marca a ser alterada</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Atualizar(Marca m)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("AtualizarMarca", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdMarca", m.IdMarca);
                comando.Parameters.AddWithValue("@Nome", m.Nome);

                if (comando.ExecuteNonQuery() > 0)
                    return "Marca atualizada com sucesso";
                else
                    throw new Exception("Erro. Marca nao localizada");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Exclui a marca do banco, usando o ID
        /// </summary>
        /// <param name="IdMarca">O ID da marca a ser excluida</param>
        /// <returns>Uma mensagem com o status da operação</returns>
        public string Excluir(int IdMarca)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ExcluirMarca", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdMarca", IdMarca);

                if (comando.ExecuteNonQuery() > 0)
                    return "Marca excluída com sucesso";
                else
                    throw new Exception("Erro. Marca nao localizada");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }
    }
}